.MODEL small
.STACK 200h
.DATA
	_error_overflow_double   DB   'Runtime Error : double Overflow$'
	_error_underflow_double  DB   'Runtime Error : double Underflow$'
	_error_overflow_int      DB   'Runtime Error : integer Overflow$'
	_error_underflow_int     DB   'Runtime Error : integer Underflow$'
	_error_div_by_zero       DB   'Runtime Error : Division by ZERO!!!$'
	_warninig_double         DB   'Runtime warning : double Value Trimmed$'
	maxdouble                DQ   1.7976931348623157e308
	mindouble                DQ   2.2250738585072014e-308
	maxint                   DW   32767
	minint                   DW  -32768
	FlagVar                  DW   ?
	varauxDouble             DQ   ?
	varauxInt                DW   ?
	_i DW ?
	_h DW ?
	_g DW ?
	_f DW ?
	_e DW ?
	_c DW ?
	_b DW ?
	_a DW ?
	_crv4 DQ ?
	_crv3 DQ ?
	_crv2 DQ ?
	_STR_1112366251 DB 'mensaje de bienvenida$'
	_crv1 DQ ?
	_d1 DQ ?
	_CTE_300_0 DQ 300.0
	_STR_141111478 DB 'como debe ser $'
	_STR_1405475285 DB 'Bien el todouble $'
	_STR_979370061 DB 'Ya esta!!!!!!$'

.CODE

.386

	;PROCEDIMIENTO OVERFLOW DOUBLE
	doubleoverflow proc 
		jo error_doubleoverflow 
		ret 
	doubleoverflow endp 


	;PROCEDIMIENTO UNDERFLOW DOUBLE
	doubleunderflow proc 
		jo error_doubleunderflow 
		ret 
	doubleunderflow endp 


	;PROCEDIMIENTO OVERFLOW INT
	intoverflow proc 
		jo error_intoverflow 
		ret 
	intoverflow endp 


	;PROCEDIMIENTO UNDERFLOW INT
	intunderflow proc 
		jo error_intunderflow 
		ret 
	intunderflow endp 


	;PROCEDIMIENTO DIVISION POR CERO
	zerodiv proc 
		jz error_zerodiv 
		ret
	zerodiv endp


	;PROCEDIMIENTO PRINT
	print proc
		mov ah,09h
		int 21h
		ret
	print endp 


	warning_asig proc 
		mov dx,offset _warninig_double
		call print 
		ret
	warning_asig endp


	error_doubleoverflow:
		mov dx,offset _error_overflow_double 
		call print
		mov al,1h 
		jmp SYSCALL_END

	error_doubleunderflow:
		mov dx,offset _error_underflow_double 
		call print
		mov al,2h 
		jmp SYSCALL_END

	error_intoverflow:
		mov dx,offset _error_overflow_int 
		call print
		mov al,3h 
		jmp SYSCALL_END

	error_intunderflow:
		mov dx,offset _error_underflow_int 
		call print
		mov al,4h 
		jmp SYSCALL_END

	error_zerodiv:
		mov dx,offset _error_div_by_zero 
		call print
		mov al,5h 
		jmp SYSCALL_END

	START:
		mov ax,@data 
		mov ds,AX 
		finit
		fclex

	;--------------Comienzo de tercetos--------------


	;IL(0)=(PRINT,_STR_1112366251)
	; Comienzo de impresion
		MOV DX, offset  _STR_1112366251
		call print
	; Fin de impresion


	;IL(1)=(ASSIGN,_a,5)
	; Comienzo de Asignacion
		mov _a , 5
	; Fin de Asignacion


	;IL(2)=(UNARY_SUB,5)
	; Comienzo de Resta unaria
		mov CX , 0
		sub CX , 5
		call intoverflow
		call intunderflow
	; Fin de Resta unaria


	;IL(3)=(ASSIGN,_a,IL(2))
	; Comienzo de Asignacion
		mov _a , CX
	; Fin de Asignacion


	;IL(4)=(ASSIGN,_b,5)
	; Comienzo de Asignacion
		mov _b , 5
	; Fin de Asignacion


	;IL(5)=(ASSIGN,_d1,_CTE_300_0)
	; Comienzo de Asignacion
		fld _CTE_300_0
		fstp _d1
	; Fin de Asignacion


	;IL(6)=(SUB,242,3)
	; Comienzo de Resta
		mov BX , 242
		sub BX , 3
		call intunderflow
	; Fin de Resta


	;IL(7)=(ADD,IL(6),8)
	; Comienzo de Suma
		add BX , 8
		call intoverflow
	; Fin de Suma


	;IL(8)=(ASSIGN,_c,IL(7))
	; Comienzo de Asignacion
		mov _c , BX
	; Fin de Asignacion


	;IL(9)=(CAST_TOINT,_d1)
	; Comienzo de conversion a Int
		fld _d1
		fistp varauxInt
		mov CX , varauxInt
	; Fin de conversion a Int


	;IL(10)=(ASSIGN,_b,IL(9))
	; Comienzo de Asignacion
		mov _b , CX
	; Fin de Asignacion


	;IL(11)=(EQ,_b,300)
	; Comienzo de comparacion
		mov ax,_b
		cmp ax,300
	; Fin de comparacion


	;IL(12)=(BF,IL(14),IL(11))
	; Comienzo de Branch por falso
	jne L_14
	; Fin de branch por falso


	;IL(13)=(PRINT,_STR_1405475285)
	; Comienzo de impresion
		MOV DX, offset  _STR_1405475285
		call print
	; Fin de impresion

L_14: 
	;IL(14)=(CAST_TOINT,_d1)
	; Comienzo de conversion a Int
		fld _d1
		fistp varauxInt
		mov BX , varauxInt
	; Fin de conversion a Int


	;IL(15)=(DIV,IL(14),_a)
	; Comienzo de Division
		 mov DX , 0
		 mov AX , BX
		 mov CX , _a
		 cmp CX,0
		 call zerodiv
		 idiv CX
		 mov CX , AX 
	; Fin de Division


	;IL(16)=(ASSIGN,_b,IL(15))
	; Comienzo de Asignacion
		mov _b , CX
	; Fin de Asignacion


	;IL(17)=(LESS,_a,_b)
	; Comienzo de comparacion
		mov ax,_a
		cmp ax,_b
	; Fin de comparacion


	;IL(18)=(BF,IL(20),IL(17))
	; Comienzo de Branch por falso
	jge L_20
	; Fin de branch por falso


	;IL(19)=(PRINT,_STR_141111478)
	; Comienzo de impresion
		MOV DX, offset  _STR_141111478
		call print
	; Fin de impresion

L_20: 
	;IL(20)=(MULT,12,3)
	; Comienzo de Mult
		mov AX , 12
		mov BX , 3
		mov DX, 0
		imul BX
		call intoverflow
		mov BX, AX
	; Fin de Suma


	;IL(21)=(ADD,IL(20),12)
	; Comienzo de Suma
		add BX , 12
		call intoverflow
	; Fin de Suma


	;IL(22)=(DIV,24,2)
	; Comienzo de Division
		 mov DX , 0
		 mov AX , 24
		 mov CX , 2
		 cmp CX,0
		 call zerodiv
		 idiv CX
		 mov CX , AX 
	; Fin de Division


	;IL(23)=(SUB,IL(21),IL(22))
	; Comienzo de Resta
		sub BX , CX
		call intunderflow
	; Fin de Resta


	;IL(24)=(DIV,IL(23),12)
	; Comienzo de Division
		 mov DX , 0
		 mov AX , BX
		 mov CX , 12
		 cmp CX,0
		 call zerodiv
		 idiv CX
		 mov CX , AX 
	; Fin de Division


	;IL(25)=(ASSIGN,_i,IL(24))
	; Comienzo de Asignacion
		mov _i , CX
	; Fin de Asignacion


	;IL(26)=(EQ,_i,3)
	; Comienzo de comparacion
		mov ax,_i
		cmp ax,3
	; Fin de comparacion


	;IL(27)=(BF,IL(29),IL(26))
	; Comienzo de Branch por falso
	jne L_29
	; Fin de branch por falso


	;IL(28)=(PRINT,_STR_979370061)
	; Comienzo de impresion
		MOV DX, offset  _STR_979370061
		call print
	; Fin de impresion

L_29: 
	;IL(29)=(END_PROG)
	; Comienzo del Fin de Programa
	NORMAL_END :
		mov al, 00h
	SYSCALL_END:
		mov ah, 4Ch
		int 21h
	END START
	; Fin de Fin de Programa

	;--------------Fin de tercetos--------------
